home *** CD-ROM | disk | FTP | other *** search
/ Programming Sound Cards / Programming Sound Cards.iso / sound_56 / s3m_osci.pas < prev    next >
Pascal/Delphi Source File  |  1995-01-01  |  5KB  |  181 lines

  1. {$M 16000,0,1000}
  2. program example_for_s3mplay;
  3.  
  4. uses S3MPlay,crt,blaster,dos;
  5.  
  6. const stereo_calc=true ;
  7.       _16bit_calc=false;        { 16bit play not yet possible }
  8.  
  9. type Parray = ^TArray;
  10.      TArray = array[0..10000] of byte;
  11.  
  12. var samplerate:word;
  13.     Stereo:Boolean;
  14.     _16bit:Boolean;
  15.     filename:string;
  16.  
  17.   {$L LINES.OBJ}
  18.   procedure linie(x1,y1,x2,y2:word;f:byte); external;
  19.  
  20.   procedure init;
  21.     begin
  22.       if not load_S3M(filename) then halt;
  23.       writeln(' ''',songname,''' loaded ... (was saved with ST',savedunder:4:2,')');
  24.       if not Init_S3Mplayer then halt;
  25.       if not init_device(2) then begin writeln(' Blaster enviroment not found sorry ... ');halt end;
  26.       setsamplerate(samplerate,stereo);
  27.       set_ST3order(true);
  28.       loopS3M:=true;
  29.     end;
  30.  
  31.   procedure bar(o,b,l:word); assembler;
  32.     asm
  33.       mov      ax,0a000h
  34.       mov      es,ax
  35.       mov      di,[o]
  36.       mov      bx,320
  37.       mov      dx,[b]
  38.       add      bx,dx
  39.       push     bp
  40.       mov      bp,[l]
  41.       cmp      bp,0
  42.       je       @@n
  43.       shl      bp,1
  44.       mov      ax,7
  45.     @@b:
  46.       mov      cx,dx
  47.       rep stosb
  48.       sub      di,bx
  49.       dec      bp
  50.       jnz      @@b
  51.     @@n:
  52.       pop      bp
  53.       push     bp
  54.       mov      bp,[l]
  55.       neg      bp
  56.       add      bp,64
  57.       shl      bp,1
  58.       mov      ax,1
  59.       cmp      bp,0
  60.       jz       @@n2
  61.     @@b2:
  62.       mov      cx,dx
  63.       rep stosb
  64.       sub      di,bx
  65.       dec      bp
  66.       jnz      @@b2
  67.     @@n2:
  68.       pop      bp
  69.     @@e:
  70.     end;
  71.  
  72.   procedure waitretrace; assembler;
  73.     asm
  74.       { waitraster : }
  75.       cli
  76.       mov     dx,03dah
  77. @@raster1:
  78.       in      al,dx
  79.       and     al,8
  80.       jz      @@raster1
  81. @@raster2:
  82.       in      al,dx
  83.       and     al,8
  84.       jnz     @@raster2
  85.       sti
  86.     end;
  87.  
  88. var pos:word;
  89.     i:word;
  90.     h:Parray;
  91.     scr:array[0..319] of byte;
  92.     scr2:array[0..319] of byte;
  93.     b:byte;
  94.     yl,yr:integer;
  95.     drawseg:word;
  96.  
  97. begin
  98.   { setup defaults: }
  99.   Samplerate:=45454;drawseg:=$a000;
  100.   Stereo:=stereo_calc;
  101.   _16bit:=_16bit_calc;
  102.   filename:=paramstr(1);
  103.   { end of default ... }
  104.   textbackground(black);textcolor(lightgray);
  105.   clrscr;
  106.   writeln(' OSCI-S3M-PLAYER for SoundBlasters written by Cyder of Green Apple');
  107.   writeln(' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~');
  108.   writeln(' Version : ',version:3:2);
  109.   if (filename='') then halt;
  110.   writeln;
  111.   Init;
  112.   if not startplaying(stereo,_16bit,false) then halt;
  113.   writeln(#13#10' dmabuflength :',DMArealbufsize[1]);
  114.   writeln(#13#10' Stop playing and exit with <ESC> ');
  115.   writeln('press any key to switch to oscillator ... ');
  116.   readkey;
  117.   asm
  118.     mov        ax,13h
  119.     int        10h
  120.     { Fill the screen with blue (in standard palette) : }
  121.     mov        ax,0a000h
  122.     mov        es,ax
  123.     xor        di,di
  124.     mov        cx,32000
  125.     mov        ax,0101h
  126.     rep stosw
  127.   end;
  128.   { DIsplay Oscilator : }
  129.   if not stereo then
  130.     begin
  131.       h:=playbuffer;
  132.       while not keypressed do
  133.         begin
  134.           waitretrace;
  135.           for pos:=0 to usedchannels-1 do
  136.             bar(320*170+pos*15+10,10,channel[pos].sampleVol*ord(channel[pos].enabled));
  137.           yl:=h^[get_zaehler] shr 1;
  138.           for pos:=1 to 319 do
  139.             begin
  140.               i:=get_zaehler; { current position in DMAbuffer }
  141.               linie(pos-1,scr[pos-1],pos,scr[pos],1);
  142.               scr[pos-1]:=yl;yl:=h^[i] shr 1;
  143.               linie(pos-1,scr[pos-1],pos,yl,14);
  144.             end;
  145.           scr[319]:=yl;
  146.         end;
  147.     end
  148.   else { in stereo mode : }
  149.     begin
  150.       h:=playbuffer;
  151.       while not keypressed do
  152.         begin
  153.           for pos:=0 to usedchannels-1 do
  154.             bar(320*170+pos*15+10,10,channel[pos].sampleVol*ord(channel[pos].enabled));
  155.           i:=get_zaehler and $fffe;
  156.           yl:=h^[i] shr 2;yr:=h^[i+1] shr 2;
  157.           for pos:=1 to 319 do
  158.             begin
  159.               i:=get_zaehler and $fffe; { current position in DMAbuffer }
  160.               if i>dmarealbufsize[1] then b:=7 else b:=4;
  161.               { left channel : }
  162.               linie(pos-1,36+scr[pos-1],pos,36+scr[pos],1);
  163.               scr[pos-1]:=yl;yl:=h^[i] shr 2;
  164.               linie(pos-1,36+scr[pos-1],pos,36+yl,14);
  165.               { right channel : }
  166.               linie(pos-1,110+scr2[pos-1],pos,110+scr2[pos],1);
  167.               scr2[pos-1]:=yr;yr:=h^[i+1] shr 2;
  168.               linie(pos-1,110+scr2[pos-1],pos,110+yr,14);
  169.             end;
  170.           scr[319]:=yl;
  171.           scr2[319]:=yr;
  172.         end;
  173.     end;
  174.   asm
  175.     mov        ax,3
  176.     int        10h
  177.   end;
  178.   stop_play;
  179.   done_module;
  180.   done_S3Mplayer;
  181. end.